package com.gestion.dao;

import com.gestion.dao.interfaces.IClienteDAO;
import com.gestion.modelo.dominio.Cliente;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * @author Mauri@<itsoluciones.com.ar>
 */
public class ClienteDAO implements IClienteDAO {

    private static ClienteDAO Instancia = null;

    private static void crearInstancia() {
        Instancia = new ClienteDAO();
    }

    /**
     * Retorna una instancia de <tt>ClienteDAO</tt> si no existe la crea y la
     * guarda en una variable estática
     *
     * @return un ClienteDAO
     */
    public static ClienteDAO getInstancia() {
        if (Instancia == null) {
            crearInstancia();
        }
        return Instancia;
    }

    /**
     *
     */
    public ClienteDAO() {
        //System.out.println(this.toString());
    }

    /**
     * Guarda un Objeto de tipo <tt>Cliente</tt> en la base de datos
     *
     * @param cliente un Objeto <tt>Cliente</tt> para ser insertado en la base
     * de datos
     * @return un Cliente con el número id del Cliente insertado
     */
    @Override
    public Cliente insertar(Cliente cliente) {

        String sql = "INSERT INTO Cliente ("
                + "nombre, apellido, provincia,localidad, direccion) "
                + "VALUES(?,?,?,?,?)";
        try {
//          System.out.println(sql);
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            //System.out.println("ok2");
            //ps.setLong  (1, cliente.getId());
            ps.setString(1, cliente.getNombre());
            ps.setString(2, cliente.getApellido());
            ps.setString(3, cliente.getProvincia());
            ps.setString(4, cliente.getLocalidad());
            ps.setString(5, cliente.getDireccion());
            System.out.println("Imprimo sentencia SQL " + ps.toString());
            ps.executeUpdate();
            ps = FabricaDAO.getConnection().prepareStatement("SELECT * FROM cliente ORDER BY id DESC LIMIT 1");
            //ps = FabricaDAO.getConnection().prepareStatement("SELECT LAST_INSERT_ID() from cliente");
            ResultSet rs = ps.executeQuery();
            System.out.println(rs.toString());
            if (rs.first()) {
                System.out.println("Largo = " + rs.getString("id"));
                return getCliente(rs.getLong("id"));
                //return getCliente(rs.getLong(1));
                //return rs.getInt(1);
            }
            return null;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    /**
     * Hace persistentes lo cambios en el Cliente Modifica en la BD lo datos del
     * Cliente
     *
     * @param cliente
     * @return cliente actualizado
     */
    @Override
    public Cliente modificar(Cliente cliente) {
        String sql = "UPDATE cliente SET  id = ?, "
                + "nombre = ? ,"
                + "apellido = ?,"
                + "provincia = ?,"
                + "localidad =? ,"
                + "direccion = ?"
                + "WHERE id = ? ";
        try {
            // Se crea el objeto PreparedStatement.
            // Este precompila la sentencatia SQL especificada.
            // Los signos de interrogación señalan el lugar en que deben establecerse los
            // parámetros antes de que se ejecute la sentencia.
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            // Se establecen los parámetros y se ejecuta la sentencia.
            ps.setLong(1, cliente.getId());
            ps.setString(2, cliente.getNombre());
            ps.setString(3, cliente.getApellido());
            ps.setString(4, cliente.getProvincia());
            ps.setString(5, cliente.getLocalidad());
            ps.setString(6, cliente.getDireccion());

            ps.executeUpdate();

            return cliente;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    /**
     * Trae todos los Clientes
     *
     * @return lista de Clientes
     */
    @Override
    public List<Cliente> getTodos() {
        String sql = "SELECT * FROM cliente ";
        List<Cliente> clientes = null;
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
//            ResultSet rs = st.executeQuery(sql);
            if (rs == null) {
                return null;
            } else {
                //clientes = new ArrayList<Cliente>();
                Cliente c;
                while (rs.next()) {
                    c = new Cliente(rs.getLong("id"), rs.getString("nombre"),
                            rs.getString("apellido"), rs.getString("provincia"),
                            rs.getString("localidad"), rs.getString("direccion"));
                    clientes.add(c);
                }
                return clientes;
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    /**
     * Busca y devuelve el Cliente correspondiente al parámetro ingresado
     *
     * @param id identificador del Cliente en la BD
     * @return un Cliente
     */
    @Override
    public Cliente getCliente(Long id) {
        String sql = "SELECT * FROM cliente WHERE id_cliente = ?";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ps.setLong(1, id);
            ResultSet rs = ps.executeQuery();
            if (rs.first()) {
                Cliente c;
                c = new Cliente(rs.getLong("id_cliente"), rs.getString("nombre"),
                        rs.getString("apellido"), rs.getString("provincia"),
                        rs.getString("localidad"), rs.getString("direccion"));
                return c;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    /**
     * Busca y devuelve el Cliente correspondiente al parámetro ingresado
     *
     * @param id identificador del Cliente en la BD
     * @return un Cliente
     */
    @Override
    public Cliente getPorId(Long valorId) {
        return getCliente(valorId);
    }
}
